package com.sunrise.estoque.repositorio;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.estoque.repositorio.iface.AjusteEstoqueDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.AjusteEstoque;
import com.sunrise.generico.visao.Filtro;

@Repository
public class AjusteEstoqueDaoImpl extends DaoService<AjusteEstoque> implements AjusteEstoqueDao {

	public List<AjusteEstoque> listarOrdenado() {
		List<AjusteEstoque> list = listar(AjusteEstoque.class);
		Collections.sort(list, new Comparator<AjusteEstoque>() {

			@Override
			public int compare(AjusteEstoque o1, AjusteEstoque o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public List<AjusteEstoque> search(AjusteEstoque ex) {
		List<AjusteEstoque> list =  searchByExample(AjusteEstoque.class, ex);
		Collections.sort(list, new Comparator<AjusteEstoque>() {

			@Override
			public int compare(AjusteEstoque o1, AjusteEstoque o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public AjusteEstoque getById(Long id) {
		return getById(id, AjusteEstoque.class);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<AjusteEstoque> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(AjusteEstoque.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		return crit.list();
	}

	
	@Override
	public AjusteEstoque buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(AjusteEstoque.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (AjusteEstoque) crit.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<AjusteEstoque> buscarPorFiltro(Filtro filtro) {
		Criteria crit = getSession().createCriteria(AjusteEstoque.class);
		if(filtro.getMotivoAjusteEstoque() != null && filtro.getMotivoAjusteEstoque().getCodigo() != null){
			crit.add(Restrictions.eq("motivo", filtro.getMotivoAjusteEstoque()));
		}
		
		if(filtro.getStatus() != null && filtro.getStatus().getCodigo() != null){
			crit.add(Restrictions.eq("status", filtro.getStatus()));
		}
		
		if(filtro.getDataInicio() != null){
			crit.add(Restrictions.ge("dataAjuste", filtro.getDataInicio()));
		}
		
		if(filtro.getDataFim() != null){
			crit.add(Restrictions.le("dataAjuste", filtro.getDataFim()));
		}
		
		if(filtro.getIdFilial() != null){
			crit.createAlias("filial", "fil");
			crit.add(Restrictions.eq("fil.id", filtro.getIdFilial()));
		}
		
		
		return crit.list();
	}

}
